home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 38.4 KB | 1,244 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FRProxy.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "FWFrameW.hpp"
-
- #ifndef FWPROXY_H
- #include "FWProxy.h"
- #endif
-
- #ifndef FWPARTNG_H
- #include "FWPartng.h"
- #endif
-
- #ifndef FWFRMING_H
- #include "FWFrming.h"
- #endif
-
- #ifndef FWUTIL_H
- #include "FWUtil.h"
- #endif
-
- #ifndef FWPXYFRM_H
- #include "FWPxyFrm.h"
- #endif
-
- #ifndef FWPRESEN_H
- #include "FWPresen.h"
- #endif
-
- #ifndef FWCLNINF_H
- #include "FWClnInf.h"
- #endif
-
- #ifndef FWPXYITE_H
- #include "FWPxyIte.h"
- #endif
-
- // ----- Graphic Includes -----
-
- #ifndef FWPOINT_H
- #include "FWPoint.h"
- #endif
-
- #ifndef FWODGEOM_H
- #include "FWODGeom.h"
- #endif
-
- // ----- ODF Foundation Includes -----
-
- #ifndef FWDEBUG_H
- #include "FWDebug.h"
- #endif
-
- #ifndef FWBARRAY_H
- #include "FWBArray.h"
- #endif
-
- #ifndef FWORDCOL_H
- #include "FWOrdCol.h"
- #endif
-
- // ----- ODUtil Includes -----
-
- #ifndef _ITEXT_
- #include "IText.h"
- #endif
-
- #ifndef _STDTYPIO_
- #include "StdTypIO.h"
- #endif
-
- // ----- OpenDoc Includes -----
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef SOM_ODShape_xh
- #include <Shape.xh>
- #endif
-
- #ifndef SOM_ODTransform_xh
- #include <Trnsform.xh>
- #endif
-
- #ifndef SOM_ODWindow_xh
- #include <Window.xh>
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include <Frame.xh>
- #endif
-
- #ifndef SOM_ODStorageUnit_xh
- #include <StorageU.xh>
- #endif
-
- #ifndef SOM_ODStorageUnitView_xh
- #include <SUView.xh>
- #endif
-
- #ifndef SOM_ODPart_xh
- #include <Part.xh>
- #endif
-
- #ifndef SOM_ODFacet_xh
- #include <Facet.xh>
- #endif
-
- #ifndef SOM_ODDraft_xh
- #include <Draft.xh>
- #endif
-
- //========================================================================================
- // Runtime Info
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment fw_embedding
- #endif
-
-
- //========================================================================================
- // Constant
- //========================================================================================
-
- typedef long FW_ProxyVersion;
- const FW_ProxyVersion FW_kProxyVersion = 0;
-
- //========================================================================================
- // Template Instantiations
- //========================================================================================
-
- FW_DEFINE_AUTO_TEMPLATE(FW_TOrderedCollectionIterator, FW_MProxy)
- FW_DEFINE_AUTO_TEMPLATE(FW_TOrderedCollection, FW_MProxy)
-
- #ifdef FW_USE_TEMPLATE_PRAGMAS
-
- #pragma template_access public
- #pragma template FW_TOrderedCollection<FW_MProxy>
- #pragma template FW_TOrderedCollectionIterator<FW_MProxy>
-
- #endif
-
- //========================================================================================
- // class FW_MProxy
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::FW_MProxy
- //----------------------------------------------------------------------------------------
-
- FW_MProxy::FW_MProxy(Environment* ev,
- FW_CEmbeddingPart* part,
- FW_Boolean shown) :
- fPart(part),
- fProxyFrames(NULL),
- fClonedFrameID(kODNULLID),
- fEmbeddedFacetCount(0),
- fSelected(FALSE),
- fShown(shown),
- fDetached(TRUE),
- fFrameGroup(0),
- fSequenceNumber(0)
- {
- FW_ASSERT(fPart != NULL);
-
- fPart->PrivAddProxy(ev, this);
- fDetached = FALSE;
-
- fProxyFrames = FW_NEW(FW_TOrderedCollection<FW_CProxyFrame>, ());
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::~FW_MProxy
- //----------------------------------------------------------------------------------------
-
- FW_MProxy::~FW_MProxy()
- {
- FW_SOMEnvironment ev;
-
- if (!fDetached)
- fPart->PrivRemoveProxy(ev, this);
-
- if (fProxyFrames)
- {
- FW_CProxyFrame* proxyFrame;
- while ((proxyFrame = fProxyFrames->First()) != NULL)
- {
- FW_ASSERT(proxyFrame->GetProxy(ev) == this);
- PrivDeleteProxyFrame(ev, proxyFrame);
- }
-
- delete fProxyFrames;
- fProxyFrames = NULL;
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::UsedShapeChanged
- //----------------------------------------------------------------------------------------
- // The used shape of one of my embedded frame has changed
-
- void FW_MProxy::UsedShapeChanged(Environment *ev,
- FW_CEmbeddingFrame* embeddingFrame,
- ODFrame* odEmbeddedFrame)
- {
- FW_UNUSED(ev);
- FW_UNUSED(embeddingFrame);
- FW_UNUSED(odEmbeddedFrame);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivSetFrameGroup
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::PrivSetFrameGroup(Environment *ev, ODID frameGroup)
- {
- fFrameGroup = frameGroup;
-
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->PrivSetFrameGroup(ev, frameGroup);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeSequenceNumber
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeSequenceNumber(Environment *ev, ODID sequenceNumber)
- {
- fSequenceNumber = sequenceNumber;
-
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->PrivChangeSequenceNumber(ev, fSequenceNumber);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::FrameShapeRequested
- //----------------------------------------------------------------------------------------
-
- ODShape* FW_MProxy::FrameShapeRequested(Environment* ev,
- FW_CEmbeddingFrame* frame,
- ODFrame* odEmbeddedFrame,
- ODShape* requestedFrameShape)
- {
- FW_UNUSED(frame);
- FW_UNUSED(odEmbeddedFrame);
-
- // ----- Simply grant the requested frame
- requestedFrameShape->Acquire(ev);
- return requestedFrameShape;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::AttachEmbeddedFrames
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::AttachEmbeddedFrames(Environment *ev)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->PrivAttach(ev);
- }
-
- fPart->PrivAddProxy(ev, this);
- fDetached = FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ProxyFrameAdded
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ProxyFrameAdded(Environment *ev, FW_CProxyFrame* proxyFrame)
- {
- FW_UNUSED(ev);
- FW_UNUSED(proxyFrame);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ProxyFrameRemoved
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ProxyFrameRemoved(Environment *ev, FW_CProxyFrame* proxyFrame)
- {
- FW_UNUSED(ev);
- FW_UNUSED(proxyFrame);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::DetachEmbeddedFrames
- //----------------------------------------------------------------------------------------
- // At the end proxyFrames are only owned by the proxy
-
- void FW_MProxy::DetachEmbeddedFrames(Environment *ev)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->PrivDetach(ev);
- }
-
- fPart->PrivRemoveProxy(ev, this);
- fDetached = TRUE;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::RemoveEmbeddedFrames
- //----------------------------------------------------------------------------------------
- // At the end this proxy doesn't have any proxyframes
- // Attention: Use DetachEmbeddedFrames if you are supporting Undo
-
- void FW_MProxy::RemoveEmbeddedFrames(Environment *ev)
- {
- // ----- First detach them, if necessary
- if (!fDetached)
- DetachEmbeddedFrames(ev);
-
- // ----- Remove all the embedded frames -----
- FW_CProxyFrame* proxyFrame ;
- while ((proxyFrame = fProxyFrames->First()) != NULL)
- PrivDeleteProxyFrame(ev, proxyFrame);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::HideShow
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::HideShow(Environment *ev, FW_Boolean shown)
- {
- if (fShown != shown)
- {
- fShown = shown;
-
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->SetPurgeable(ev, !shown);
- if (!shown)
- proxyFrame->Purge(ev);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivDeleteProxyFrame
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::PrivDeleteProxyFrame(Environment* ev, FW_CProxyFrame* proxyFrame)
- {
- FW_UNUSED(ev);
- fProxyFrames->Remove(proxyFrame);
- ProxyFrameRemoved(ev, proxyFrame);
-
- delete proxyFrame;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::GetProxyFrame
- //----------------------------------------------------------------------------------------
-
- FW_CProxyFrame* FW_MProxy::GetProxyFrame(Environment* ev, ODStorageUnitID frameID) const
- {
- FW_TOrderedCollectionIterator<FW_CProxyFrame> ite(fProxyFrames);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (frameID == proxyFrame->GetFrameID(ev))
- return proxyFrame;
- }
-
- return NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivContainerIDToProxyFrame
- //----------------------------------------------------------------------------------------
- // Returns a proxyframe knowing is container frame ID
-
- FW_CProxyFrame* FW_MProxy::PrivContainerIDToProxyFrame(Environment* ev, ODStorageUnitID containerID) const
- {
- FW_TOrderedCollectionIterator<FW_CProxyFrame> ite(fProxyFrames);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->IsAttached(ev) && containerID == proxyFrame->GetContainingFrameID(ev))
- return proxyFrame;
- }
-
- return NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::GetEmbeddedFacetUnderMouse
- //----------------------------------------------------------------------------------------
- // 'mouse' in Frame coordinate system
-
- ODFacet* FW_MProxy::GetEmbeddedFacetUnderMouse(Environment* ev, ODFacet* embeddingFacet, const FW_CPoint& mouse) const
- {
- ODPoint odMouse = mouse;
-
- FW_CEmbeddedODFacetsIterator ite(ev, this, embeddingFacet, kODFrontToBack);
- for (ODFacet* odFacet = ite.First(ev); ite.IsNotComplete(ev); odFacet = ite.Next(ev))
- {
- if (odFacet->ContainsPoint(ev, &odMouse, NULL))
- return odFacet;
- }
-
- return NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::SetSelectState
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::SetSelectState(Environment* ev, FW_Boolean state)
- {
- fSelected = state;
-
- // ----- Set the selected flag in facet -----
- FW_CProxyEmbeddedFrameIterator ite(ev, this);
- for (ODFrame* odEmbeddedFrame = ite.First(ev); ite.IsNotComplete(ev); odEmbeddedFrame = ite.Next(ev))
- {
- FW_CODFrameFacetIterator ite2(ev, odEmbeddedFrame);
- for (ODFacet* facet = ite2.First(ev); ite2.IsNotComplete(ev); facet = ite2.Next(ev))
- facet->SetSelected(ev, state);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeHighlight
- //----------------------------------------------------------------------------------------
- // if embeddingFrame is NULL change the
- void FW_MProxy::ChangeHighlight(Environment* ev, ODHighlight highlight, FW_CEmbeddingFrame* embeddingFrame)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if ((embeddingFrame == NULL) || (proxyFrame->GetContainingFrame(ev) == embeddingFrame))
- {
- proxyFrame->ChangeHighlight(ev, highlight);
- }
- }
-
- /*
- FW_CProxyEmbeddedFrameIterator ite(ev, this);
- for (ODFrame* odEmbeddedFrame = ite.First(ev); ite.IsNotComplete(ev); odEmbeddedFrame = ite.Next(ev))
- {
- FW_Boolean doIt = (embeddingFrame == NULL);
- if (!doIt)
- {
- FW_CAcquiredODFrame containingFrame = odEmbeddedFrame->AcquireContainingFrame(ev);
- doIt = (containingFrame == embeddingFrame->GetODFrame(ev));
- }
-
- if (doIt)
- {
- FW_CODFrameFacetIterator ite2(ev, odEmbeddedFrame);
- for (ODFacet* facet = ite2.First(ev); ite2.IsNotComplete(ev); facet = ite2.Next(ev))
- facet->ChangeHighlight(ev, highlight);
- }
- }
- */
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::AcquireEmbeddedPart
- //----------------------------------------------------------------------------------------
- // if instantiate == FALSE try to find a proxyfrom already in memory to get the part. If can't
- // find one then return NULL
-
- ODPart* FW_MProxy::AcquireEmbeddedPart(Environment* ev, FW_Boolean instantiate) const
- {
- // Should not be called when empty because proxys are automatically deleted
- FW_ASSERT(fProxyFrames->Count() != 0);
-
- FW_CProxyFrame* proxyFrame = fProxyFrames->First();
- if (instantiate == FALSE)
- {
- while (proxyFrame != NULL && !proxyFrame->IsFrameInMemory(ev))
- proxyFrame = fProxyFrames->After(proxyFrame);
- }
-
- if (proxyFrame == NULL)
- return NULL;
- else
- return proxyFrame->GetFrame(ev)->AcquirePart(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::GetProxyFrame
- //----------------------------------------------------------------------------------------
- // returns a proxyframe knowing its embedding frame
-
- FW_CProxyFrame* FW_MProxy::GetProxyFrame(Environment* ev, FW_CEmbeddingFrame* embeddingFrame) const
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->GetContainingFrame(ev) == embeddingFrame)
- return proxyFrame;
- }
- return NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::AcquireEmbeddedFrame
- //----------------------------------------------------------------------------------------
- // returns the embedded frame of this proxy (embedded) frame. If instantiate == FALSE return
- // NULL unless the frame is already instantiated.
-
- ODFrame* FW_MProxy::AcquireEmbeddedFrame(Environment* ev, FW_CEmbeddingFrame* embeddingFrame, FW_Boolean instantiate) const
- {
- ODFrame* embeddedFrame = NULL;
- FW_CProxyFrame* proxyFrame = GetProxyFrame(ev, embeddingFrame);
- if (proxyFrame && (proxyFrame->IsFrameInMemory(ev) || instantiate == TRUE))
- {
- embeddedFrame = proxyFrame->GetFrame(ev);
- embeddedFrame->Acquire(ev);
- }
-
- return embeddedFrame;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::IsEmbeddedFrame
- //----------------------------------------------------------------------------------------
- // returns true if the embeddedframe belongs to this proxy
-
- FW_Boolean FW_MProxy::IsEmbeddedFrame(Environment* ev, ODFrame* embeddedFrame) const
- {
- ODID frameID = embeddedFrame->GetID(ev);
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->GetFrameID(ev) == frameID)
- return TRUE;
- }
-
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::Externalize
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::Externalize(Environment* ev,
- ODStorageUnitView* destinationSUView,
- FW_CCloneInfo* cloneInfo)
- {
- // ----- Write first a version number -----
- FW_CByteArray byteArray(&FW_kProxyVersion, sizeof(FW_ProxyVersion));
- destinationSUView->SetValue(ev, byteArray);
-
- // ----- Write out the hide/show state -----
- byteArray.Set(&fShown, sizeof(fShown));
- destinationSUView->SetValue(ev, byteArray);
-
- // ----- Write the SequenceNumber -----
- byteArray.Set(&fSequenceNumber, sizeof(fSequenceNumber));
- destinationSUView->SetValue(ev, byteArray);
-
- // ----- Write the frameGroup -----
- byteArray.Set(&fFrameGroup, sizeof(fFrameGroup));
- destinationSUView->SetValue(ev, byteArray);
-
- FW_CFrame* scopeFrame = (cloneInfo != NULL) ? cloneInfo->GetScopeFrame(ev) : NULL;
-
- // ----- Write the nymber of proxyframes -----
- unsigned long count = 0;
- if (scopeFrame != NULL)
- count = 1;
- else
- {
- // Count only the proxyFrame with a containing frame persistent
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->GetContainingFrame(ev)->IsPersistent(ev))
- count++;
- }
- }
-
- FW_CByteArray byteArray2(&count, sizeof(unsigned long));
- destinationSUView->SetValue(ev, byteArray2);
-
- // ----- Clone or write the proxyframe(s) -----
- if (scopeFrame != NULL)
- {
- #ifdef FW_DEBUG
- FW_CEmbeddingFrame* scopeEmbeddingFrame = FW_DYNAMIC_CAST(FW_CEmbeddingFrame, scopeFrame);
- FW_ASSERT(scopeEmbeddingFrame);
- FW_CProxyFrame* proxyFrame = GetProxyFrame(ev, scopeEmbeddingFrame);
- #else
- FW_CProxyFrame* proxyFrame = GetProxyFrame(ev, (FW_CEmbeddingFrame*)scopeFrame);
- #endif
- FW_ASSERT(proxyFrame != NULL);
-
- FW_Boolean result = proxyFrame->ExternalizeProxyFrame(ev, destinationSUView, cloneInfo);
- FW_ASSERT(result = TRUE);
- }
- else
- {
- // ----- Externalize each persistent proxy Frame -----
- FW_CProxyProxyFrameIterator ite2(this);
- for (FW_CProxyFrame* proxyFrame = ite2.First(); ite2.IsNotComplete(); proxyFrame = ite2.Next())
- {
- FW_Boolean result = proxyFrame->ExternalizeProxyFrame(ev, destinationSUView, cloneInfo);
- FW_ASSERT(result = TRUE);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::Embed
- //----------------------------------------------------------------------------------------
-
- FW_DECLARE_THROW_POINT (FW_MProxy_Embed);
-
- void FW_MProxy::Embed(Environment *ev,
- FW_CPresentation* embeddingPresentation,
- ODPart *embeddedPart, // Might be null
- ODFrame* odEmbeddedFrame, // Might be null
- ODType suggestedFrameType, // preferred frame type
- ODShape* frameShape,
- ODTypeToken viewType,
- ODTypeToken presentationType,
- ODID frameGroupID,
- FW_Boolean isOverlaid,
- FW_Boolean subFrame)
- {
- /* Exception Handling
- If an exception is thrown while we are partway through creating frames then we
- have destroy all previously created frames.
- */
- FW_ASSERT(frameShape);
- FW_ASSERT(embeddingPresentation);
- #ifdef FW_DEBUG
- if (odEmbeddedFrame == NULL)
- FW_ASSERT(embeddedPart != NULL);
- #endif
-
- FW_CAcquiredODPart aqEmbeddedPart;
-
- ODFrame* passedInFrame = NULL;
- ODFrame* sourceFrame = NULL;
- ODFrame* newEmbeddedFrame = NULL;
-
- // ----- Force the frame type to be the one of the embedded frame ------
- if (odEmbeddedFrame != NULL)
- suggestedFrameType = (odEmbeddedFrame->GetStorageUnit(ev) != NULL) ? kODFrameObject : kODNonPersistentFrameObject;
-
- // ----- Create an embedded frame for each of my display frame -----
- FW_TRY
- { // loop protection
- FW_CPresentationFrameIterator ite(ev, embeddingPresentation);
- for (FW_CEmbeddingFrame* embeddingFrame = (FW_CEmbeddingFrame*)ite.First(ev); ite.IsNotComplete(ev); embeddingFrame = (FW_CEmbeddingFrame*)ite.Next(ev))
- {
- FW_CProxyFrame* proxyFrame;
-
- FW_CAcquiredODShape aqItsShape(frameShape->Copy(ev));
-
- // ----- Create the frame -----
- FW_Boolean isEmbeddedFrame = FALSE;
- if (odEmbeddedFrame != NULL)
- {
- FW_CAcquiredODFrame aqContainingFrame = odEmbeddedFrame->AcquireContainingFrame(ev);
- isEmbeddedFrame = (aqContainingFrame == embeddingFrame->GetODFrame(ev));
- }
-
- if (isEmbeddedFrame)
- {
- // [HLX] I should not change the presentation and the view type of an existing embedded frame
- // odEmbeddedFrame->ChangeViewType(ev, viewType);
- // odEmbeddedFrame->ChangePresentation(ev, presentationType == NULL ? FW_CSession::Tokenize(ev, kODPresDefault) : presentationType);
- odEmbeddedFrame->SetFrameGroup(ev, frameGroupID);
- odEmbeddedFrame->ChangeSequenceNumber(ev, 0);
- odEmbeddedFrame->SetSubframe(ev, subFrame);
-
- newEmbeddedFrame = odEmbeddedFrame;
- passedInFrame = odEmbeddedFrame;
- odEmbeddedFrame = NULL; // We used it. Next time around we want to create a new frame
-
- proxyFrame = this->PrivNewProxyFrame(ev, (FW_CEmbeddingPart*)GetPart(ev), embeddingFrame, newEmbeddedFrame, TRUE);
-
- // Change the frame shape after we have a proxyFrame (only if necessary)
- FW_CAcquiredODShape aqFrameShape = newEmbeddedFrame->AcquireFrameShape(ev, NULL);
- if (!aqFrameShape->IsSameAs(ev, aqItsShape))
- newEmbeddedFrame->ChangeFrameShape(ev, aqItsShape, NULL);
- }
- else
- {
- // It is better to acquire the part only when needed.
- if (embeddedPart == NULL)
- {
- aqEmbeddedPart = passedInFrame->AcquirePart(ev);
- embeddedPart = aqEmbeddedPart;
- }
-
- FW_CAcquiredODFrame embeddedODFrame = embeddingFrame->PrivCreateEmbeddedFrame(ev,
- suggestedFrameType,
- embeddedPart,
- aqItsShape,
- NULL,
- viewType,
- presentationType,
- isOverlaid,
- subFrame);
-
- // ----- Create the proxyFrame for this embedded frame -----
- proxyFrame = this->PrivNewProxyFrame(ev, embeddingFrame->GetPart(ev), embeddingFrame, embeddedODFrame, FALSE);
-
- proxyFrame->PrivSetFrameGroup(ev, frameGroupID);
- newEmbeddedFrame = proxyFrame->GetFrame(ev);
-
- }
-
- // ----- Set the newly embedded frame's link status -----
- newEmbeddedFrame->ChangeLinkStatus(ev, kODNotInLink);
-
- FW_TRY
- {
- // ----- Attach source frames if needed -----
- // If we are creating two or more frames at the same time then this tells the embedded part
- // that those frames are supposed to display the same content.
- if (sourceFrame)
- {
- FW_ASSERT(embeddedPart);
- embeddedPart->AttachSourceFrame(ev, newEmbeddedFrame, sourceFrame);
- }
- sourceFrame = newEmbeddedFrame;
-
- // ----- Create its facets -----
- // We have to make sure not to leave a dangling frame if this fails
- FW_CHECK_THROW_POINT (FW_MProxy_Embed);
- // XXX if isEmbedded frame then we shouldn't destroy it (since we didn't create it)
- proxyFrame->CreateAllFacets(ev);
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING () {
- embeddingFrame->PrivRemoveEmbeddedFrame (ev, proxyFrame);
- FW_THROW_SAME ();
- }
- FW_CATCH_END
- }
- } // FW_TRY loop protection
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING () {
- // Work in reverse to clean up everything from previous passes through the loop.
- // That is if we completed two loops and failed partway through loop 3, assume that loop 3
- // was cleaned up properly (in try/catch block above) and undo loops 1 and 2.
- FW_THROW_SAME ();
- }
- FW_CATCH_END
-
- // ----- If we haven't use odEmbeddedFrame there is a problem -----
- FW_ASSERT(odEmbeddedFrame == NULL);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivPostClone
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::PrivPostClone(Environment* ev, FW_CCloneInfo* cloneInfo)
- {
- if (fClonedFrameID == kODNULLID)
- return;
-
- FW_CFrame* scopeFrame = cloneInfo->GetScopeFrame(ev);
- FW_ASSERT(scopeFrame);
-
- // ----- Get the new frame from my draft -----
- FW_CAcquiredODFrame aqODEmbeddedFrame = cloneInfo->GetToDraft(ev)->AcquireFrame(ev, fClonedFrameID);
- FW_ASSERT(aqODEmbeddedFrame != NULL);
-
- // ----- Set the containing frame
- aqODEmbeddedFrame->SetContainingFrame(ev, scopeFrame->GetODFrame(ev));
-
- // ----- Now we can embed it -----
- FW_CAcquiredODShape aqFrameShape = aqODEmbeddedFrame->AcquireFrameShape(ev, NULL);
-
- Embed(ev,
- scopeFrame->GetPresentation(ev),
- NULL,
- aqODEmbeddedFrame,
- (aqODEmbeddedFrame->GetStorageUnit(ev) != NULL) ? kODFrameObject : kODNonPersistentFrameObject,
- aqFrameShape,
- aqODEmbeddedFrame->GetViewType(ev),
- aqODEmbeddedFrame->GetPresentation(ev),
- aqODEmbeddedFrame->GetFrameGroup(ev),
- aqODEmbeddedFrame->IsOverlaid(ev),
- aqODEmbeddedFrame->IsSubframe(ev));
-
- // ----- Cloning done -----
- fClonedFrameID = kODNULLID;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::Internalize
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::Internalize(Environment* ev,
- ODStorageUnitView* sourceSUView,
- FW_CCloneInfo *cloneInfo)
- {
- FW_CByteArray byteArray;
-
- // ----- Read first the version number -----
- FW_ProxyVersion version;
- sourceSUView->GetValue(ev, sizeof(FW_ProxyVersion), byteArray);
- byteArray.CopyBuffer(&version, sizeof(FW_ProxyVersion));
- FW_ASSERT(version == FW_kProxyVersion);
-
- // ----- Read in the hide/show state -----
- sourceSUView->GetValue(ev, sizeof(fShown), byteArray);
- byteArray.CopyBuffer(&fShown, sizeof(fShown));
-
- // ----- Read in the Sequence Number -----
- sourceSUView->GetValue(ev, sizeof(fSequenceNumber), byteArray);
- byteArray.CopyBuffer(&fSequenceNumber, sizeof(fSequenceNumber));
-
- // ----- Read in the frameGroup -----
- sourceSUView->GetValue(ev, sizeof(fFrameGroup), byteArray);
- byteArray.CopyBuffer(&fFrameGroup, sizeof(fFrameGroup));
- if (fFrameGroup != 0)
- fPart->PrivSetNextFrameGroup(ev, fFrameGroup);
-
- // ----- Read the number of proxyframe -----
- unsigned long count;
-
- sourceSUView->GetValue(ev, sizeof(unsigned long), byteArray);
- byteArray.CopyBuffer(&count, sizeof(unsigned long));
-
- // ----- Clone or Read in the proxyframe(s) -----
- if (cloneInfo != NULL)
- {
- FW_ASSERT(cloneInfo->GetScopeFrame(ev));
-
- if (cloneInfo->fClonedProxyList == NULL)
- cloneInfo->fClonedProxyList = FW_NEW(FW_TOrderedCollection<FW_MProxy>, ());
-
- cloneInfo->fClonedProxyList->AddLast(this);
-
- FW_ASSERT(count == 1); // if clone we should have only one embedded frame
-
- ODStorageUnitRef aSURef;
- sourceSUView->GetValue(ev, sizeof(ODStorageUnitRef), byteArray);
- byteArray.CopyBuffer(&aSURef, sizeof(ODStorageUnitRef));
-
- FW_ASSERT(sourceSUView->IsValidStorageUnitRef(ev, aSURef));
-
- ODStorageUnitID fromFrameID = sourceSUView->GetIDFromStorageUnitRef(ev, aSURef);
- fClonedFrameID = cloneInfo->Clone(ev, fromFrameID, 0, 0);
- }
- else
- {
- for (unsigned long i = 0; i<count; i++)
- this->PrivNewProxyFrame(ev, fPart, sourceSUView);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeEmbeddedFramesViewType
- //----------------------------------------------------------------------------------------
- // ATTENTION: I am forcing the embedded frame to be in memory
-
- void FW_MProxy::ChangeEmbeddedFramesViewType(Environment* ev, ODTypeToken viewType)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->GetFrame(ev)->ChangeViewType(ev, viewType);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeExternalTransforms
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeExternalTransforms(Environment* ev, FW_Fixed x, FW_Fixed y)
- {
- if (fEmbeddedFacetCount != 0)
- {
- FW_CAcquiredODTransform transform = ::FW_NewODTransform(ev, FW_CPoint(x, y));
- ChangeExternalTransforms(ev, transform);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeExternalTransforms
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeExternalTransforms(Environment* ev, ODTransform* transform)
- {
- FW_ASSERT(transform);
-
- if (fEmbeddedFacetCount == 0)
- return;
-
- transform->Acquire(ev);
- FW_CAcquiredODTransform aqTransform(transform);
-
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->IsFrameInMemory(ev))
- {
- FW_CAcquiredODTransform aqCopy;
-
- if (transform == NULL)
- aqCopy = transform = aqTransform->Copy(ev);
-
- FW_CODFrameFacetIterator ite(ev, proxyFrame->GetFrame(ev));
- for (ODFacet* odFacet = ite.First(ev); ite.IsNotComplete(ev); odFacet = ite.Next(ev))
- {
- odFacet->ChangeGeometry(ev, NULL, transform, NULL);
- }
-
- transform = NULL;
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ReleaseAll
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ReleaseAll(Environment* ev)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- proxyFrame->Release(ev);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeFrameShapes
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeFrameShapes(Environment* ev, FW_Fixed width, FW_Fixed height)
- {
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->IsFrameInMemory(ev))
- {
- FW_CAcquiredODShape newFrameShape = ::FW_NewODShape(ev, FW_CRect(FW_kZeroPoint, width, height));
- proxyFrame->GetFrame(ev)->ChangeFrameShape(ev, newFrameShape, NULL);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeFrameShapes
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeFrameShapes(Environment* ev, ODShape* newShape)
- {
- FW_ASSERT(newShape != NULL);
-
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- if (proxyFrame->IsFrameInMemory(ev))
- {
- FW_CAcquiredODShape aqShape(newShape->Copy(ev));
- proxyFrame->GetFrame(ev)->ChangeFrameShape(ev, aqShape, NULL);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivAddProxyFrame
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::PrivAddProxyFrame(Environment* ev, FW_CProxyFrame* proxyFrame)
- {
- #ifdef FW_DEBUG
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* pf = ite.First(); ite.IsNotComplete(); pf = ite.Next())
- {
- if (pf == proxyFrame)
- FW_DEBUG_MESSAGE("FW_MProxy::PrivAddProxyFrame ProxyFrame already attached");
- }
- #else
- FW_UNUSED(ev);
- #endif
-
- FW_ASSERT(proxyFrame->GetProxy(ev) == this);
-
- fProxyFrames->AddLast(proxyFrame);
-
- ProxyFrameAdded(ev, proxyFrame);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::AdjustBorderShape
- //----------------------------------------------------------------------------------------
- // Shape is content coordinate and already intersected with the content shape. ATTENTION
- // shape can be NULL
-
- void FW_MProxy::AdjustBorderShape(Environment* ev,
- FW_CEmbeddingFrame* embeddingFrame,
- ODFacet* embeddedFacet,
- ODShape* shape)
- {
- FW_UNUSED(ev);
- FW_UNUSED(embeddingFrame);
- FW_UNUSED(embeddedFacet);
- FW_UNUSED(shape);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::ChangeLinkStatus
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::ChangeLinkStatus(Environment* ev, ODLinkStatus linkStatus)
- {
- FW_CProxyProxyFrameIterator iter(this);
- for (FW_CProxyFrame* proxyFrame = iter.First(); iter.IsNotComplete(); proxyFrame = iter.Next())
- {
- // Does not force frame to be internalized.
- proxyFrame->ChangeLinkStatus(ev, linkStatus);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::CreateFacet
- //----------------------------------------------------------------------------------------
- // CreateFacet should be called from your implementation of FW_MProxy::CreateFacets
-
- ODFacet* FW_MProxy::CreateFacet(Environment* ev,
- ODFacet* containingFacet,
- ODFrame* embeddedFrame,
- ODShape* clipShape,
- ODTransform* externalTransform,
- ODCanvas* canvas,
- ODCanvas* biasCanvas,
- ODFacet* siblingFacet,
- ODFramePosition position)
- {
- // I need to increment the number of facet before calling CreateEmbeddedFacet because
- // if I am called back during CreateEmbeddedFacet the count won't be right
-
- fEmbeddedFacetCount++;
- ODFacet* newFacet = NULL;
- FW_VOLATILE(newFacet);
-
- FW_TRY
- {
- newFacet = containingFacet->CreateEmbeddedFacet(ev,
- embeddedFrame,
- clipShape,
- externalTransform,
- canvas,
- biasCanvas,
- siblingFacet,
- position);
- newFacet->SetSelected(ev, GetSelectState(ev));
-
- FW_CProxyFrame* proxyFrame = GetProxyFrame(ev, embeddedFrame->GetID(ev));
- newFacet->ChangeHighlight(ev, proxyFrame->GetHighlight(ev));
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING ()
- {
- delete newFacet; // in case SetSelected fails
- fEmbeddedFacetCount--;
-
- FW_THROW_SAME ();
- }
- FW_CATCH_END
-
- return newFacet;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::Reveal
- //----------------------------------------------------------------------------------------
- // Attention: revealShape is in embeddingFrame frame coordinates
-
- FW_Boolean FW_MProxy::Reveal(Environment *ev,
- FW_CEmbeddingFrame* embeddingFrame,
- ODFrame* embeddedFrame,
- ODShape* revealShape)
- {
- FW_UNUSED(ev);
- FW_UNUSED(embeddingFrame);
- FW_UNUSED(embeddedFrame);
- FW_UNUSED(revealShape);
-
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivNewProxyFrame
- //----------------------------------------------------------------------------------------
-
- FW_CProxyFrame* FW_MProxy::PrivNewProxyFrame(Environment* ev,
- FW_CEmbeddingPart* part,
- ODStorageUnitView* suView)
- {
- FW_CProxyFrame* proxyFrame = new FW_CProxyFrame(ev, this, part);
-
- FW_TRY
- {
- if (proxyFrame->InternalizeProxyFrame(ev, suView, NULL))
- this->PrivAddProxyFrame(ev, proxyFrame);
- else
- {
- delete proxyFrame;
- proxyFrame = NULL;
- }
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING ()
- {
- delete proxyFrame;
- FW_THROW_SAME ();
- }
- FW_CATCH_END
-
- return proxyFrame;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::PrivNewProxyFrame
- //----------------------------------------------------------------------------------------
-
- FW_CProxyFrame* FW_MProxy::PrivNewProxyFrame(Environment* ev,
- FW_CEmbeddingPart* part,
- FW_CEmbeddingFrame* containingFrame,
- ODFrame* embeddedFrame,
- FW_Boolean saveLimboState)
- {
- FW_Boolean wasInLimbo = saveLimboState ? embeddedFrame->IsInLimbo(ev) : FALSE;
- FW_CProxyFrame* proxyFrame = new FW_CProxyFrame(ev, this, part, containingFrame, embeddedFrame, wasInLimbo);
-
- // ----- Add it to the proxy frame list
- this->PrivAddProxyFrame(ev, proxyFrame);
-
- return proxyFrame;
- }
-
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::GetEmbeddedPartName
- //----------------------------------------------------------------------------------------
-
- void FW_MProxy::GetEmbeddedPartName(Environment* ev, FW_CString& name) const
- {
- name = "";
-
- ODIText* newName = NULL;
- FW_VOLATILE(newName);
-
- FW_TRY
- {
- FW_CAcquiredODPart embeddedPart = AcquireEmbeddedPart(ev);
- newName = ::ODGetITextProp(ev, embeddedPart->GetStorageUnit(ev), kODPropName, kODMacIText, kODNULL);
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING ()
- {
- // exception consumed
- }
- FW_CATCH_END
-
- if (newName != NULL)
- {
- name.ReplaceAll(newName);
- ::DisposeIText(newName);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_MProxy::OpenInWindow
- //----------------------------------------------------------------------------------------
- // Called by FW_CEmbeddingFrame::OpenSelection. Override it if for any reason you don't
- // want to open all selected proxy (see ODFTable)
-
- void FW_MProxy::OpenInWindow(Environment* ev, FW_CProxyFrame* proxyFrame)
- {
- ODFrame* embeddedFrame = proxyFrame->GetFrame(ev);
- FW_CAcquiredODPart aqODPart = embeddedFrame->AcquirePart(ev);
- aqODPart->Open(ev, embeddedFrame);
- }
-
- //---------------------------------------------------------------------------------------
- // FW_MProxy::Purge
- //---------------------------------------------------------------------------------------
-
- ODSize FW_MProxy::Purge(Environment *ev)
- {
- ODSize freedSize = 0;
-
- // ----- Try purging all purgeable embedded frames -----
- FW_CProxyProxyFrameIterator ite(this);
- for (FW_CProxyFrame* proxyFrame = ite.First(); ite.IsNotComplete(); proxyFrame = ite.Next())
- {
- freedSize += proxyFrame->Purge(ev);
- }
-
- return freedSize;
- }
-
- //---------------------------------------------------------------------------------------
- // FW_MProxy::SetPurgeable
- //---------------------------------------------------------------------------------------
-
- void FW_MProxy::SetPurgeable(Environment *ev, FW_CEmbeddingFrame* frame, FW_Boolean purgeable)
- {
- FW_CProxyFrame* proxyFrame = GetProxyFrame(ev, frame);
- FW_ASSERT(proxyFrame);
- proxyFrame->SetPurgeable(ev, purgeable);
- }
-
- //---------------------------------------------------------------------------------------
- // FW_MProxy::NeedFacets
- //---------------------------------------------------------------------------------------
-
- FW_Boolean FW_MProxy::NeedFacets(Environment *ev, FW_CEmbeddingFrame* embeddingFrame) const
- {
- FW_UNUSED(ev);
- FW_UNUSED(embeddingFrame);
-
- return TRUE;
- }
-